package com.mvc.web.common.utils;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;

import org.apache.log4j.Logger;

/**
 * @ClassName: AnnotationDealUtil
 * @Description: 解析自定义注解
 * @author: 白海安(baiha@jizhicar.com) 2017年8月31日 下午6:18:07
 * @version V1.0
 */
public class AnnotationDealUtil {
	
	protected static Logger log = Logger.getLogger(AnnotationDealUtil.class.getName());

	/** 
	 * @Description: 注解验证 
	 * @author 白海安(baiha@jizhicar.com) 2017年8月31日 下午6:28:31
	 * @version V1.0
	 */
	@SuppressWarnings("unchecked")
	public static Map<String, Object> validate(Object bean) {
		Map<String, Object> result = new HashMap<String, Object>();
		result.put("message", "验证通过");
		result.put("result", true);
		Class<?> cls = bean.getClass();
		// 检测field是否存在
		try {
			// 获取实体字段集合
			Field[] fields = cls.getDeclaredFields();
			for (Field f : fields) {
				// 通过反射获取该属性对应的值
				f.setAccessible(true);
				// 获取字段值
				Object value = f.get(bean);
				// 获取字段上的注解集合
				Annotation[] arrayAno = f.getAnnotations();
				for (Annotation annotation : arrayAno) {
					// 获取注解类型（注解类的Class）
					Class<?> clazz = annotation.annotationType();
					// 获取注解类中的方法集合
					Method[] methodArray = clazz.getDeclaredMethods();
					for (Method method : methodArray) {
						// 获取方法名
						String methodName = method.getName();
						// 过滤错误提示方法的调用
						if (methodName.equals("message")) {
							continue;
						}
						// 初始化注解验证的方法处理类
						Object obj = ValidatorUtil.class.newInstance();
						// 获取方法
						try {
							// 根据方法名获取该方法
							Method m = obj.getClass().getDeclaredMethod(methodName, Object.class, Field.class);
							// 调用该方法
							result = (Map<String, Object>) m.invoke(obj, value, f);
							/* 验证结果 有一处失败则退出 */
							if (result.get("result").equals(false)) {
								return result;
							}
						} catch (Exception e) {
							e.printStackTrace();
							log.error("找不到该方法:" + methodName);
						}
					}
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
			log.error("验证出错");
		}
		return result;
	}
}
